﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace puerto_serie
{
    public class Tablero
    {
        private int SIZEX=8;
        private int SIZEY=8;
        private int[,] GameMatrix_;
        private int TamañoBarcoActual_,id_;
        private FormEscogerBarco formDeBarco;
        public Tablero(int id)
        {
            GameMatrix_= new int [SIZEY,SIZEX];
            TamañoBarcoActual_ = 1;
            this.id_ = id;
        }
        public void setFormDeBarco(FormEscogerBarco formDeBarco)
        {
            this.formDeBarco = formDeBarco;
        }
        /// <summary>
        /// Codigo para verificar si se puede introducir 
        /// un barco en una posicion especifica sin colisiones
        /// </summary>
        /// <param name="direction"></param>
        /// <param name="xPosition"></param>
        /// <param name="yPosition"></param>
        /// <returns></returns>
        public bool establishShip(int direction, int xPosition, int yPosition)
        {
            bool shipWasSet = false;
            if (direction == 1)
            {
                shipWasSet = verifyPositionsForShip(1, 0, xPosition , yPosition);
                return shipWasSet;
            }
            else
            {
                shipWasSet = verifyPositionsForShip(0, 1, xPosition, yPosition );
               return shipWasSet;
            }

        }
        /// <summary>
        /// Codigo para verificar si el disparo fue efectivo
        /// </summary>
        /// <param name="xPosition"></param>
        /// <param name="yPosition"></param>
        /// <returns></returns>
        public int shoot(int xPosition, int yPosition)
        {
            int POSICIONCONBARCO = 1;
            int DISPAROFALLIDO = 2;
            int BARCODISPARADO = 3;
            int POSICIONVACIA =0;
            if (GameMatrix_[yPosition, xPosition] == POSICIONCONBARCO)
            {
                formDeBarco.realizarCambio(xPosition, yPosition, id_, BARCODISPARADO);
                GameMatrix_[yPosition, xPosition] = BARCODISPARADO;
                return BARCODISPARADO;
            }
            else if (GameMatrix_[yPosition, xPosition] == POSICIONVACIA)
            {
                formDeBarco.realizarCambio(xPosition, yPosition, id_, DISPAROFALLIDO);
                GameMatrix_[yPosition, xPosition] = DISPAROFALLIDO;
                return DISPAROFALLIDO;
            }
            else
            {
                return DISPAROFALLIDO;
            }
        }
        /// <summary>
        /// Funcion para obtener el valor que tiene una posicion en la matriz
        /// </summary>
        /// <param name="xPosition"></param>
        /// <param name="yPosition"></param>
        /// <returns></returns>
        public int obtenerValorDePosicion(int xPosition,int yPosition)
        {
            return GameMatrix_[yPosition, xPosition];
        }
        /// <summary>
        /// Funcion encargada de verificar si se puede poner 
        /// un barco en una posición indicada, en caso de poder 
        /// poner el barco, cambia los valores en la matriz
        /// estableciendo que hay un barco
        /// </summary>
        /// <param name="xDirection"></param>
        /// <param name="yDirection"></param>
        /// <param name="xPosition"></param>
        /// <param name="yPosition"></param>
        /// <returns></returns>
        private bool verifyPositionsForShip(int xDirection,int yDirection,int xPosition,int yPosition)
        {
            int ESPACIOVACIO = 0;
            int POSICIONCONBARCO = 1;
            bool canBeSet = true;
            for (int i = 0; i < TamañoBarcoActual_; i++)
            {
                if (yPosition + (yDirection * i) < SIZEY && xPosition + (xDirection * i) < SIZEX)
                {
                    if (GameMatrix_[yPosition + (yDirection * i), xPosition + (xDirection * i)] != ESPACIOVACIO)
                    {
                        canBeSet = false;
                        break;
                    }
                    else
                    {
                        continue;
                    }
                }
                else
                {
                    canBeSet = false;
                    break;
                }
            }
            if (canBeSet)
            {
                for (int i = 0; i < TamañoBarcoActual_; i++)
                {
                    GameMatrix_[yPosition + (yDirection*i), xPosition + (xDirection*i)] = POSICIONCONBARCO;
                    formDeBarco.realizarCambio(xPosition + (xDirection * i), yPosition+(yDirection*i), id_, POSICIONCONBARCO);
                }
                TamañoBarcoActual_++;
                return canBeSet;
            }
            else
            {
                return canBeSet;
            }
        }
        public int obtenerCantidadDeBarcosInsertados()
        {
            return TamañoBarcoActual_;
        } 
        public void imprimirTablero()
        {
            int bound0 = GameMatrix_.GetUpperBound(0);
            int bound1 = GameMatrix_.GetUpperBound(1);
            int s1;
            for (int i = 0; i <= bound0; i++)
            {
                for (int x = 0; x <= bound1; x++)
                {
                    s1 = GameMatrix_[i, x];
                    Console.Write(s1);
                }
                Console.WriteLine();
            }
        }
    }

}
